﻿	//глобальные переменные
	var map;   
	var waypoint_num;
	var waypoint_arr = new Array();
	var markerArray=[];
	var polylineArray=[];
	var dragedMarker;
	var menushow;
	var contexmenumapcoord;
	var geocoder;
	var findmarker;
	var output;
	
	//////////////////////////////////////
	//Инициализация карты
	function initialize() {
		//настройка карты
        var mapOptions = {
          center: new google.maps.LatLng(59.941256, 30.299864),
          zoom: 11,
          mapTypeId: google.maps.MapTypeId.ROADMAP,
		  mapTypeControl: false,
		  streetViewControl: false,
		  disableDoubleClickZoom: true
        };
		//инициализация переменных
		menushow=false;	
		waypoint_num = 0;
		output = document.getElementById("waypoints");
		geocoder = new google.maps.Geocoder();
		//отображение карты
        map = new google.maps.Map(document.getElementById("map_canvas"),
            mapOptions);
		//добавление обработчика клика по карте
		google.maps.event.addListener(map, 'click', function(event) {
			placeMarker(event.latLng);
		});
		//добавление обработчика правого клика по карте
		google.maps.event.addListener(map, 'rightclick', function(event) {
			closemenus();
			var map_menu = document.getElementById("map_menu");
			map_menu.style.visibility = "visible";
			map_menu.style.top = window.event.y.toString()+"px";
			map_menu.style.left = window.event.x.toString()+"px";
			menushow=true;
			contexmenumapcoord = event.latLng;
		});
		//добавление обработчика зумирования
		google.maps.event.addListener(map, 'zoom_changed', function(event) {
			closemenus();
		});
		//добавление обработчика перемещения карты
		google.maps.event.addListener(map, 'drag', function(event) {
			closemenus();
		});
		
    }
	
	///////////////////////////////////
	//Обработчик клика по карте
	function placeMarker(location) {
		if(menushow==true){
			//скрываем все меню
			closemenus();
			menushow = false;
			return;
		}
		var marker_symbol;
		//если первый клик - ставим стартовый маркер
		if(waypoint_num == 0){
			var lable = 'Начало';
			marker_symbol = {
				fillOpacity: 1,
				fillColor: "#FFFFFF",
				strokeColor: "#FF0000",
				path: google.maps.SymbolPath.BACKWARD_CLOSED_ARROW,
				strokeWeight: 3,
				scale: 5
			};
			//получаем адрес стартовой позиции
			geocoder.geocode({'latLng': location}, function(results, status) {
				if (status == google.maps.GeocoderStatus.OK){
					var splitadsress = results[0].formatted_address.split(',');
					document.getElementById("start_adr").innerHTML = "из "+ splitadsress[0]+","+ splitadsress[1]+","+ splitadsress[2];
				}
			});
		}
		//иначе ставим финальный и превращаем предыдущий маркер промежуточную точку
		else{
			var lable = 'Конец';
			marker_symbol = {
				strokeColor: "#FF5500",
				path: google.maps.SymbolPath.BACKWARD_OPEN_ARROW,
				strokeWeight: 4,
				scale: 5
			};
			//получаем адрес последней точки
			geocoder.geocode({'latLng': location}, function(results, status) {
				if (status == google.maps.GeocoderStatus.OK){
					var splitadsress = results[0].formatted_address.split(',');
					document.getElementById("finish_adr").innerHTML = "в "+ splitadsress[0]+","+ splitadsress[1]+","+ splitadsress[2];
				}
			});
			//если текущий маркер второй, то предыдущий не обновляется
			if(waypoint_num>1){
				markerArray[waypoint_num-1].setIcon({
					fillOpacity: 1,
					fillColor: "#FFFFFF",
					strokeColor: "#000000",
					path: google.maps.SymbolPath.CIRCLE,
					strokeWeight: 2,
					scale: 4
				});
				markerArray[waypoint_num-1].setOptions({
					raiseOnDrag: false,
					crossOnDrag: false,
				});
				markerArray[waypoint_num-1].title = 'Точка ' + (waypoint_num-1);
			}
		}
		//сохраняем точку на карте в массив
		waypoint_arr[waypoint_num] = [location.lat(), location.lng()];
		//отрисовываем линии между последним и предпоследним маркером
		if(waypoint_num>0){
			polylineArray[waypoint_num-1] = new google.maps.Polyline({
				path: [markerArray[waypoint_num-1].position, location],
				strokeColor: "#0000FF",
				strokeOpacity: 0.4,
				strokeWeight: 4
			});
			polylineArray[waypoint_num-1].setMap(map);
		}
		//отрисовываем маркер
		markerArray[waypoint_num] = new google.maps.Marker({
		position: location,
		map: map,
		title: lable,
		draggable: true,
		icon: marker_symbol,
		raiseOnDrag: true,
		crossOnDrag: true
		});
		//добавляем обработчики событий:
		//окончание перемещения
		google.maps.event.addListener(markerArray[waypoint_num], 'dragend', function(event) {
			replaceMarker(event.latLng);
		});
		//начало перемещения
		google.maps.event.addListener(markerArray[waypoint_num], 'dragstart', function(event) {
			chooseMarker(event.latLng);
		});
		//процесс перемещения
		google.maps.event.addListener(markerArray[waypoint_num], 'drag', function(event) {
			replace_realtime_Marker(event.latLng);
		});
		//добавление обработчика правого клика по маркеру
		google.maps.event.addListener(markerArray[waypoint_num], 'rightclick', function(event) {
			chooseMarker(event.latLng);
			showmenuMarker();	
		});
		//обновляем общее кол-во маркеров
		waypoint_num++;
		//вводим координаты точек маршрута в форму
		output.value="";
		for(var i=0; i<waypoint_num; i++)output.value=output.value + waypoint_arr[i][0]+"," + waypoint_arr[i][1]+"|";
		//dev[remove]
		document.getElementById("dev").innerHTML="";
		for(var i=0; i<waypoint_num; i++)document.getElementById("dev").innerHTML=document.getElementById("dev").innerHTML+"[" + waypoint_arr[i][0]+"," + waypoint_arr[i][1]+"], <br>";
		//dev
		
		closemenus();
	}
	
	//////////////////////////////////////////////
	//Обработчик начала перемещения - определяем перемещаемый маркер
	function chooseMarker(location) {
		for(var i=0; i<markerArray.length; i++){
			if(location == markerArray[i].position)break;
		}
		dragedMarker = i;
	}
	
	//////////////////////////////////////////////
	//обработчик окончания перемещения маркера
	function replaceMarker(location) {
		//обновление данных о расположении маркера в массиве
		waypoint_arr[dragedMarker] = [location.lat(), location.lng()];
		//обновление адреса начала и конца
		if(dragedMarker==0){
			geocoder.geocode({'latLng': location}, function(results, status) {
				if (status == google.maps.GeocoderStatus.OK){
					var splitadsress = results[0].formatted_address.split(',');
					document.getElementById("start_adr").innerHTML = "из "+ splitadsress[0]+","+ splitadsress[1]+","+ splitadsress[2];
				}
			});
		}
		if(dragedMarker==waypoint_num-1){
			geocoder.geocode({'latLng': location}, function(results, status) {
				if (status == google.maps.GeocoderStatus.OK){
					var splitadsress = results[0].formatted_address.split(',');
					document.getElementById("finish_adr").innerHTML = "в "+ splitadsress[0]+","+ splitadsress[1]+","+ splitadsress[2];
				}
			});
		}
		//обновление данных в форме
		output.value="";
		for(var i=0; i<waypoint_num; i++)output.value=output.value + waypoint_arr[i][0]+"," + waypoint_arr[i][1]+"|";
		//dev[remove]
		document.getElementById("dev").innerHTML="";
		for(var i=0; i<waypoint_num; i++)document.getElementById("dev").innerHTML=document.getElementById("dev").innerHTML+"[" + waypoint_arr[i][0]+"," + waypoint_arr[i][1]+"], <br>";
		//dev
	}
	
	/////////////////////////////////////////
	//обработчик перемещения маркера
	function replace_realtime_Marker(location) {
		var oldpath;
		var path;
		//перерисовка линий соединения маркеров
		if(dragedMarker!=0){
			//перерисовываем предыдущую линию, если это не стартовый маркер
			path = [new google.maps.LatLng(waypoint_arr[dragedMarker-1][0], waypoint_arr[dragedMarker-1][1], false), location];
			polylineArray[dragedMarker-1].setPath(path);
		}
		if(waypoint_num-dragedMarker>1){
			//перерисовываем следующую линию, если маркер не финальный
			path = [location, new google.maps.LatLng(waypoint_arr[dragedMarker+1][0], waypoint_arr[dragedMarker+1][1], false)];
			polylineArray[dragedMarker].setPath(path);
		};
	}
	
	//////////////////////////////////////////
	//удаление маркера
	function deleteMarker(marker) {
		if(marker==0){
			//удаление начального маркера
			//удаление всех маркеров
			for(var i=0; i<waypoint_num; i++){
				markerArray[i].setMap(null);
			}
			markerArray.length=0;
			//удаление всех линий
			for(var i=0; i<waypoint_num-1; i++){
				polylineArray[i].setMap(null);
			}
			polylineArray.length=0;
			//очистка массива
			waypoint_arr.length=0;
			waypoint_num=0;
			//очистка адресов
			document.getElementById("finish_adr").innerHTML = "";
			document.getElementById("start_adr").innerHTML = "";
		}
		else{
			//удалениие промежуточных и финишного маркеров
			markerArray[marker].setMap(null);
			//удаление маркера из массива маркеров
			for(var i=marker; i<waypoint_num-1; i++){
				markerArray[i]=markerArray[i+1];
			}
			markerArray.length = markerArray.length-1;
			
			if(marker!=waypoint_num-1){
				//удаление промежуточного маркера
				//удаление следующей линии и перерисовка предыдущий
				var path = [new google.maps.LatLng(waypoint_arr[marker-1][0], waypoint_arr[marker-1][1], false), new google.maps.LatLng(waypoint_arr[marker+1][0], waypoint_arr[marker+1][1], false)];
				polylineArray[marker-1].setPath(path);
				polylineArray[marker].setMap(null);
				//удаление пути из массива путей
				for(var i=marker; i<waypoint_num-2; i++){
					polylineArray[i]=polylineArray[i+1];
				}
			}
			else{
				//удаление финишного маркера
				polylineArray[marker-1].setMap(null);
				if(marker>1){
					//меняем предыдущий маркер на финишный если это не 2-ой маркер
					markerArray[marker-1].setIcon({
						strokeColor: "#FF5500",
						path: google.maps.SymbolPath.BACKWARD_OPEN_ARROW,
						strokeWeight: 4,
						scale: 5
					});
					markerArray[marker-1].setOptions({
						raiseOnDrag: true,
						crossOnDrag: true,
					});
					markerArray[marker-1].title = 'Finish';
					//обновляем адрес конечного маркера
					geocoder.geocode({'latLng': markerArray[marker-1].position}, function(results, status) {
						if (status == google.maps.GeocoderStatus.OK){
							var splitadsress = results[0].formatted_address.split(',');
							document.getElementById("finish_adr").innerHTML = "в "+ splitadsress[0]+","+ splitadsress[1]+","+ splitadsress[2];
						}
					});
				}
				else{
					//если 2-й маркер очищаем адрес
					document.getElementById("finish_adr").innerHTML = "";
				}
			}
			polylineArray.length = polylineArray.length-1;
			//удаление точки из массива
			for(var i=marker; i<waypoint_num-1; i++){
				waypoint_arr[i]=waypoint_arr[i+1];
			}
			waypoint_arr.length = waypoint_arr.length-1;
			waypoint_num--;
		}
		//скрываем все меню
		closemenus();
		//обновляем данные в форме
		output.value="";
		for(var i=0; i<waypoint_num; i++)output.value=output.value + waypoint_arr[i][0]+"," + waypoint_arr[i][1]+"|";
		//dev[remove]
		document.getElementById("dev").innerHTML="";
		for(var i=0; i<waypoint_num; i++)document.getElementById("dev").innerHTML=document.getElementById("dev").innerHTML + waypoint_arr[i][0]+", " + waypoint_arr[i][1]+", <br>";
		//dev
		
	}
	
	///////////////////////////////////////////////
	//отображение контекстного меню маркера
	function showmenuMarker(){
		//скрываем все меню
		closemenus();
		//отображаем меню
		if(dragedMarker==-1)var map_menu = document.getElementById("findmarker_menu");
		else{
			if(dragedMarker==0) var map_menu = document.getElementById("start_marker_menu");
			else var map_menu = document.getElementById("marker_menu");
		}
		map_menu.style.visibility = "visible";
		map_menu.style.top = window.event.y.toString()+"px";
		map_menu.style.left = window.event.x.toString()+"px";
		menushow=true;
	}
	
	//////////////////////////////////////////////
	//поиск адреса на карте
	function findadr(){
		geocoder.geocode({'address': document.getElementById("adrtofind").value}, function(results, status) {
			if (status == google.maps.GeocoderStatus.OK){
				//если поисковый маркер уже есть на карте, то убираем его
				if(findmarker){
					findmarker.setMap(null);
				}
				//выстывляем найденый адрес по центру карты
				map.setCenter(results[0].geometry.location);
				//ставим поисковый маркер по найденым координатам
				findmarker = new google.maps.Marker({
					map: map,
					position: results[0].geometry.location
				});
				findmarker.setMap(map);
				//добавляем обработчик правового клика по маркеру
				google.maps.event.addListener(findmarker, 'rightclick', function(event) {
					dragedMarker=-1;
					showmenuMarker();	
				});
				//добавляем обработчик клика по маркеру
				google.maps.event.addListener(findmarker, 'click', function(event) {
					dragedMarker=-1;
					showmenuMarker();	
				});
			}
			else{
				//если поисковый маркер уже есть на карте, то убираем его
				if(findmarker){
					findmarker.setMap(null);
				}
				alert("Адрес не найден!");
			}
		});
	}
	
	/////////////////////////////////////////////////
	//закрываем все контекстные меню
	function closemenus(){
		document.getElementById("map_menu").style.visibility = "hidden";
		document.getElementById("marker_menu").style.visibility = "hidden";
		document.getElementById("start_marker_menu").style.visibility = "hidden";
		document.getElementById("findmarker_menu").style.visibility = "hidden";
	}
	
	///////////////////////////////////////////////////
	//проверка заполнения формы перед отправкой
	function checkform(){
		if(output.value==""){
			alert("Не задан маршрут!");
			return;
		}
		else{
			if(document.getElementById("deptime").value==""){
				alert("Не задано время старта!");
			}
			else{
				if(document.getElementById("arrtime").value==""){
					alert("Не задано время прибытия!");
				}
				else{
					//если все заполнено верно, то отправляем
					document.getElementById("outputform").method="post";
					document.getElementById("waypoints").name="waypoints";
					document.getElementById("deptime").name="deptime";
					document.getElementById("arrtime").name="arrtime";
					document.getElementById("outputform").submit();
				}
			}
		}
	}